ContextCaptureユーザーガイド

LODの原則

レベルオブディティール(LOD)フォーマットは、非常に大規模な3Dモデルのロードと視覚化を可能にします。これは、次の方法で実現されます。
  • ビューアから遠くに移動した表現の複雑さを削減します。
  • 現在の視点から見えるモデルの部分だけをロードします。

LODはツリー構造を採用しており、最上位ノードは非常に粗い幾何形状で、下に行くにつれてしだいに細かい幾何形状になります。リーフノードは、最も精細な3D表現です。

LODツリーの例を次に示します。各ノードに幾何形状とテクスチャが含まれます。点群LOD表現と異なり、子には完全なメッシュ指定が含まれており、親メッシュを完全に置き換えます。

たとえば、レベル2ノードは2つの子に分かれ、それぞれがモデルの半分を、親より細かいスケールで含んでいます。レベル3ノードを表示する際には、レベル2は非表示にする必要があります。

ノードは画面への近さに応じて表示されます。例に戻ると、画面から遠い場合は、ノードA(レベル1)が表示されます。近づくにつれて、ノードは子によって置き換えられていきます。たとえば、ノードAがノードBに置き換えられ、ノードBがノードCとDに置き換えられます。ノードCにズームした場合、ノードCがレベル4ノードのEとFによって置き換えられる一方、兄弟ノードのDは変わりません。

ノードを子によって置き換える過程では、ノードが完全に消え、幾何形状で置き換えられない場合があります。あるいは、メッシュの簡略化によってノードの幾何形状が大幅に縮小された結果、親が三角形を保持しなくなる可能性もあります。どちらの場合も、空ノードが必要です。このLOD表現には空ノードが出現する可能性があり、考慮する必要があります。

ある特定の時点では、可能なツリーパスから表示されるノードは1つだけです。このLODの例では、ノードBが表示されている場合、レベル1ノードは表示されておらず、ノードBの子孫も表示されていません。

ここで問題になるのは、特定のノードが画面に表示されるのに「十分な近さ」であることをどう判断するかです。これに関して、ContextCapture(ViewerまたはWeb Viewer)のアプローチでは、ノードが画面上に表示される大きさ(ピクセル単位)を基準とします。計算を高速化するため、ノードの境界球を代用します。境界球を画面上に投影すると、直径がdの円になります。この直径dが、ノードが画面に表示される大きさの尺度として用いられます。

各ノードには、ピクセル最大画面直径が指定されています。この値は、ノードが画面上に表示されると決定される、投影された境界球の直径dの最大値を表します。この値を超えると、ノードはその子によって置き換えられます。

上の例では、境界球が画面上に投影された円の直径が40ピクセル未満である間は、ノードAが表示されます。境界球の投影の大きさがこれを超えると、ノードBがロードされて表示されます。

モデルに近づくほど、ツリー構造内の高解像度のノードが表示されますが、これは見える部分に関してだけです。すなわち、高解像度でメモリにロードされるのはツリーのごく一部分だけです。

この例では、カメラがノードDにズームインするとノードEとFは見えなくなるので、モデルのD部分には高解像度が必要ですが、ノードC、E、Fは不要になります。メモリ消費を最小化するには、これらのノードを削除する必要があります。

一般的に、一定時間見えない状態にあるノードは削除されます。見えなくなったノードはすぐに削除されるわけではありません。カメラが少し移動するとまた見えるようになる可能性が高いからです。一定時間経ってからノードを削除すれば、ノードがすぐに必要とされる確率は低くなります。ノードの子が現在必要とされている場合、そのノードは削除されません。

まとめると、LODでのContextCapture(ViewerまたはWeb Viewer)データの表示の原則は次のとおりです。

  • ある特定の時点では、ルートからリーフまでのパスの中で、表示されるノードは1つだけです。
  • ノードが表示されるのは、画面上への投影があらかじめ定義された範囲(ピクセル単位)に入る場合です。
  • ノードは必要な場合(親が画面上の最大投影面積に達した場合)にのみロードされます。
  • 一定時間見えない状態にあるノードは削除されます。